##TODO hacer que esto devuelve una lista con todas las cosas para poder revisarlas cuando se está haciendo el munging o el analisis
##TODO hacer que esto guarde los resultados en disco (.txt) con un ancho de pagina grande para verlo con ultraedit
basic_summarize_data <- function (data){
  print("####################     DIM       ####################")
  print(dim(data))
  print("####################     NAMES     ####################")
  print(names(data))
  print("####################     CLASSES   ####################")
  print(sapply(data[1,],class))
  print("####################     HEAD      ####################")
  print(head(data))
  print("####################     SUMMARY   ####################")
  print(summary(data)) 
  print("####################     % UNIQUES vs TOTALES (for factors)   ####################")
  print(unlist(sapply(data, function (x){if(is.factor(x)){round(100*length(unique(x))/length(x), 2)}})))
  print("####################     UNIQUE (for factors)   ####################")
  print(Filter(Negate(is.null),sapply(data, function (x){porc <- length(unique(x))/length(x);if(is.factor(x)){ if(porc< 0.5){unique(x)} else {paste0(round(100*porc,2),"% de factores respecto al total")}}})))
  print("####################     TABLE (for factors)   ####################")
  print(Filter(Negate(is.null),sapply(data, function (x){porc <- length(unique(x))/length(x);if(is.factor(x)){ if(porc< 0.5){table(x)} else {paste0(round(100*porc,2),"% de factores respecto al total")}}})))
  print("####################     % of NAs for numerics   ####################")
  print(unlist(sapply(data, function (x){ if(is.numeric(x)){round(100*sum(is.na(x))/length(x),2)}})))
}

basic_statistics_data <- function (data){
  print("####################     RANGEs (for numerics)   ####################")
  print(unlist(sapply(data, function (x){if(is.numeric(x)){range(x)}})))
  #print("####################     MEANs (for numerics)   ####################")
  means <- unlist(sapply(data, function (x){if(is.numeric(x)){mean(x)}}))
  #print(means)
  #print("####################     Vars (for numerics)   ####################")
  vars <- unlist(sapply(data, function (x){if(is.numeric(x)){var(x)}}))
  #print(vars)
  #print("####################     SDs (for numerics)   ####################")
  sds <- unlist(sapply(data, function (x){if(is.numeric(x)){sd(x)}}))
  #print(sds)
  #print("####################     CORRELATION (for numerics & factors)   ####################")
  #print(my_correlation(data))
  
  cbind(means, vars, sds)
} 

# calcula la tabla de correlación para todas las columnas que sean numericas o factores(los convierte a numeric)
my_correlation <- function(data, precision=2, limit=NULL){
  # data data.frame con los datos
  # si hay un limite solo muestra los valores cuya correlacion supere dicho limite
  #if(!is.null(limit) & limit > 1){
  #  error ("El limite de la correlacion no puede ser mayor que 1")
  #}
  only.numerics <- only_numeric_and_factors(data)
  
  my_cor <- cor(only.numeric)
  my_cor[lower.tri(my_cor, diag=TRUE)] <- NA
  my_cor <- round(my_cor, digits=precision)
  if(!is.null(limit)){
    my_cor[abs(my_cor) < limit] <- NA
  }
  my_cor <- my_cor[upper.tri(my_cor)]
  names <- colnames(data)
  names(my_cor) <- names_triangle_superior(data)
  
  my_cov <- cov(only.numeric)
  my_cov[lower.tri(my_cov, diag=TRUE)] <- NA
  my_cov <- round(my_cov, digits=precision*2)
  if(!is.null(limit)){
    my_cov[abs(my_cov) < limit] <- NA
  }
  my_cov <- my_cov[upper.tri(my_cov)]
  names <- colnames(data)
  names(my_cov) <- names_triangle_superior(data)
  
  
  return (cbind(covarianza=my_cov, correlacion=my_cor))
}

only_numeric_and_factors <- function(data){
  if(any(sapply(data[1,],is.factor))){
    data <- function(d) modifyList(d, lapply(d[, sapply(d, is.factor)], function(x) as.numeric(x)))
  } 
  only.numeric <- data[sapply(data, is.numeric)]
  return (only.numeric)
}
 
basic_names_cleaning <- function(data){
  names.c <- tolower(names(data))
  #names.c <- strsplit(names.c,"\\.")
  #names.c <- sapply(names.c,function(x){x[1]})
  names.c <- gsub("_","",names.c,)
  names(data) <- names.c
  
  return(data)
}

names_triangle_superior <- function (data){
  ncols <-ncol(data)
  names <- colnames(data)
  df <- data.frame(nrow=1)
  cont <- 1
  for (i in 1:(ncols-1))
  {
    for(j in i:(ncols-1))
    {
      df[cont]<-(paste(names[i], names[j+1], sep=","))
      cont <- cont +1;
    }
  }
  
  return (df)
}

######## trucos

## pintar varias columnas de un dataframe a la vez
# plot(data, plot.type="single", lty=1:3, col=1:3, lwd=2)
# legend(x="bottomleft", legend=colnames(data), lty=1:3, col=1:3, lwd=2)
# abline(h=0)
# title("Monthly cc returns")

## mostrar la comparativa entre todas las columnas de un dataset
# pairs(lab4Returns.z, col="blue")

# plot mean vs. sd values
# plot(sigmahat.vals, muhat.vals, pch=1:3, cex=2, col=1:3, ylab = "mean", xlab="sd (risk)")
# abline(h=0)     
# legend(x="topright", legend=names(muhat.vals), pch=1:3, col=1:3, cex=1.5)     
